
// ##############################################################
// int epoll_create(int size);---创建一个epoll的句柄
// int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);---设置epoll句柄
// int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);---等待
// typedef union epoll_data
// {
//     void *ptr;
//     int fd;
//     uint32_t u32;
//     uint64_t u64;
// } epoll_data_t;

// struct epoll_event
// {
//     uint32_t events;   /* Epoll events */
//     epoll_data_t data; /* User data variable */
// };
// ##############################################################
// epoll将用户关心的事情在内核中自动创建红黑树的节点并挂起，根据红黑树上节点要关心的事件，结合已经发生的事件
// 自动根据fd和已经发生的事件，构建就绪节点
// 自动将构建好的节点，插入到就绪队列中
// 使用epoll，用户只需要设置关系，获取结果，不需要关心fd和event的细节
// epoll为什么高效呢？底层只要有fd就绪，OS会自己给我们构建节点，连入到就绪队列，上层只需要不断的从就绪队列中将数据拿走，就完成了获取就绪事件的任务
// 本质还是生产者消费者模型，epoll自己保证了接口是线程安全的
// 底层没有就绪事件，上层就阻塞等待
#include <sys/epoll.h>
#include<iostream>
#include<memory>
#include"epollServer.hpp"
#include<string>
using namespace lb_epoll;
void change(std::string request)
{
    std::cout<<"change : "<<request<<std::endl;
}  
int main()
{
    std::unique_ptr<EpollServer> epoll_server(new EpollServer(change));
    epoll_server->Start();
    return 0;
}